from django.http import JsonResponse
from django.views.decorators.http import require_http_methods
from django.views.decorators.csrf import csrf_exempt
import json
from web.models import User, Contact
import hashlib
from django.utils import timezone
from django import forms
from django.forms.models import model_to_dict
from web.utils import Utils

MyUtils = Utils()
class UserForm(forms.ModelForm):
    class Meta:
        model = User
        fields = ['username', 'password', 'avatar']

@csrf_exempt
@require_http_methods(["POST"])
def register(request):
    """用户注册"""
    try:
        # 检查请求体是否为空
        if not request.POST:
            return JsonResponse({'code': 400, 'message': '请求体不能为空'})
            
        data = request.POST
        username = data.get('username')
        password = data.get('password')
        
        # 检查必填参数
        if not username or not password:
            return JsonResponse({'code': 400, 'message': '用户名和密码不能为空'})
        
        # 检查用户名是否已存在
        if User.objects.filter(username=username).exists():
            return JsonResponse({'code': 400, 'message': '用户名已存在'})
        

        
        # 创建用户
        user = UserForm(data=data, files=request.FILES)
        if user.is_valid():
            user.save()
            new_user = model_to_dict(user.instance)
            new_user["avatar"] = user.instance.avatar.url if user.instance.avatar else None
            new_user["created_at"] = user.instance.created_at.strftime("%Y-%m-%d %H:%M:%S")
            new_user["updated_at"] = user.instance.updated_at.strftime("%Y-%m-%d %H:%M:%S")
            del new_user['id']
            del new_user['password']
            return JsonResponse({'code': 200, 'message': '注册成功', 'data': new_user})
        else:
            return JsonResponse({'code': 400, 'message': '用户名或密码格式错误'})
        
      
    except json.JSONDecodeError:
        return JsonResponse({'code': 400, 'message': '无效的JSON格式'})
    except Exception as e:
        return JsonResponse({'code': 500, 'message': str(e)})

@csrf_exempt
@require_http_methods(["POST"])
def login(request):
    """用户登录"""
    try:
        data = request.POST
        username = data.get('username')
        password = data.get('password')
        
        try:
            # 使用 filter().first() 替代 get()，避免抛出异常
            user = User.objects.filter(username=username, password=password).first()
            if not user:
                return JsonResponse({'code': 401, 'message': '用户名或密码错误'})
            
            # 如果登录成功就更新用户最后登录时间
            user.last_login = timezone.now()
            user.save(update_fields=['last_login'])  # 只更新 last_login 字段

            # 构建返回数据
            user_dict = model_to_dict(user)
            user_dict["avatar"] = user.avatar.url if user.avatar else None
            user_dict["created_at"] = user.created_at.strftime("%Y-%m-%d %H:%M:%S")
            user_dict["updated_at"] = user.updated_at.strftime("%Y-%m-%d %H:%M:%S")
            user_dict["last_login"] = user.last_login.strftime("%Y-%m-%d %H:%M:%S")
            del user_dict['id']
            del user_dict['password']
            return JsonResponse({
                'code': 200,
                'message': '登录成功',
                'data': user_dict
            })
        except Exception as e:
            return JsonResponse({'code': 401, 'message': str(e)})
            
    except Exception as e:
        return JsonResponse({'code': 500, 'message': str(e)})
    


# 获取用户列表
def get_user_list(request):
    """获取用户列表"""
    users = User.objects.all()
    user_list = []
    for user in users:
        user_dict = model_to_dict(user)
        user_dict["created_at"] = user.created_at.strftime("%Y-%m-%d %H:%M:%S")
        user_dict["updated_at"] = user.updated_at.strftime("%Y-%m-%d %H:%M:%S")
        user_dict["avatar"] = user.avatar.url if user.avatar else None
        del user_dict['password']
        del user_dict['id']
        user_list.append(user_dict)
    return JsonResponse({'code': 200, 'message': '获取用户列表成功', 'data': user_list})


@csrf_exempt
# 编辑用户信息，可以修改用户名、密码
def edit_user(request):
    """编辑用户信息"""
    if request.method == 'POST':
        data = request.POST
        user_id = data.get('user_id')
        if not user_id:
            return JsonResponse({'code': 400, 'message': '用户ID不能为空'})
        user = User.objects.filter(user_id=user_id).first()
        if not user:
            return JsonResponse({'code': 400, 'message': '用户不存在'})
        # 判断用户是否提供了密码
        password = data.get('password')
        if password is None or password == '':
            data = data.copy()
            data['password'] = user.password


        form = UserForm(data=data, instance=user, files=request.FILES)
        # 需要捕获 错误信息ValueError
        try:
            if form.is_valid():
                form.save()
                return JsonResponse({'code': 200, 'message': '编辑用户信息成功', 'data': {
                    'user_id': user.user_id,
                    'username': user.username,
                    'avatar': user.avatar.url if user.avatar else None,
                    'created_at': user.created_at.strftime("%Y-%m-%d %H:%M:%S"),
                    'updated_at': user.updated_at.strftime("%Y-%m-%d %H:%M:%S")
                }})
            else:
                err = MyUtils.Forms_GetError(form)
                return JsonResponse({'code': 400, 'message': err[1]})
        except ValueError as e:
            return JsonResponse({'code': 400, 'message': str(e)})
        except Exception as e:

            
            return JsonResponse({'code': 400, 'message': str(e)})
    
    else:
        return JsonResponse({'code': 405, 'message': '请求方法错误'})


class ContactForm(forms.ModelForm):
    class Meta:
        model = Contact
        fields = "__all__"

@csrf_exempt
# 创建联系方式
def create_contact(request):
    """创建联系方式"""
    if request.method == 'POST':
        data = request.POST
        user_id = data.get('user_id')
        if not user_id:
            return JsonResponse({'code': 400, 'message': '用户ID不能为空'})
        user = User.objects.filter(user_id=user_id).first()
        if not user:
            return JsonResponse({'code': 400, 'message': '用户不存在'})
        
        contact = Contact.objects.filter(user_id=user_id).first()
        # 如果联系方式不存在，就创建
        try:

            if not contact:
                contact = ContactForm(data=data)
                if contact.is_valid():
                    contact.save()
                    contact_dict = model_to_dict(contact.instance)
                    return JsonResponse({'code': 200, 'message': '创建联系方式成功', 'data': contact_dict})
                else:
                    err = MyUtils.Forms_GetError(contact)
                    print(err)
                    return JsonResponse({'code': 400, 'message': err[1]})
            # 如果联系方式存在，就更新
            else:
                contact = ContactForm(instance=contact, data=data)
                if contact.is_valid():
                    contact.save()
                    contact_dict = model_to_dict(contact.instance)
                    return JsonResponse({'code': 200, 'message': '更新联系方式成功', 'data': contact_dict})
                else:
                    return JsonResponse({'code': 400, 'message': '更新联系方式失败'})

        except Exception as e:
            return JsonResponse({'code': 400, 'message': str(e)})
        

# 获取联系方式
def get_contact(request):
    """获取联系方式"""
    user_id = request.GET.get('user_id')
    if not user_id:
        return JsonResponse({'code': 400, 'message': '用户ID不能为空'})
    user = User.objects.filter(user_id=user_id).first()
    if not user:
        return JsonResponse({'code': 400, 'message': '用户不存在'})
    contact = Contact.objects.filter(user_id=user_id).first()
    if not contact:
        return JsonResponse({'code': 400, 'message': '联系方式不存在'})
    
    contact_dict = model_to_dict(contact)
    del contact_dict['id']
    return JsonResponse({'code': 200, 'message': '获取联系方式成功', 'data': contact_dict})



# 注销用户
def delete_user(request):
    """注销用户"""
    user_id = request.GET.get('user_id')
    if not user_id:
        return JsonResponse({'code': 400, 'message': '用户ID不能为空'})
    user = User.objects.filter(user_id=user_id).first()
    if not user:
        return JsonResponse({'code': 400, 'message': '用户不存在'})
    user.delete()
    return JsonResponse({'code': 200, 'message': '注销用户成功'})


# 验证用户是否是管理员
def is_admin(request):
    """验证用户是否是管理员"""
    username = request.GET.get('username')
    password = request.GET.get('password')
    user = User.objects.filter(username=username, password=password, is_admin=True).first()
    if not user:
        return JsonResponse({'code': 400, 'message': '用户不存在'})
    

    return JsonResponse({'code': 200, 'message': 'Hi, Admin! Welcome back!', 'data': user.is_admin})